home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok90 / bumprevmo1.0 / bumprevmo.mod < prev    next >
Text File  |  1993-11-04  |  8KB  |  283 lines

  1. (*(***********************************************************************
  2.  
  3. :Program.    BumpRevMO.mod
  4. :Contents.   Revision bumper
  5. :Author.     Hartmut Goebel [hG]
  6. :Address.    Aufseßplatz 5, D-8500 Nürnberg 40
  7. :Address.    UseNet: hartmut@oberon.nbg.sub.org
  8. :Address.    Z-Netz: hartmut@asn.zer   Fido: 2:246/81.1
  9. :Copyright.  Copyright © 1993 by Hartmut Goebel
  10. :Language.   Oberon-2
  11. :Translator. Amiga Oberon 3.0
  12. :Version.    $VER: BumpRevMO.mod 1.0 (9.3.93)
  13.  
  14. (* $StackChk- $NilChk- $RangeChk- $CaseChk- $OvflChk- $ReturnChk- $ClearVars- *)
  15. (****i* BumpRevMO.mod/--history-- ***************************************
  16. *
  17. *********************************************************************)*)*)
  18.  
  19. MODULE BumpRevMO;
  20.  
  21. (****** BumpRevMO ****************************************************(**
  22. *
  23. *  NAME
  24. *     BumpRevMO -- updating revision module  (xxxRev.mod and xxxRev.def)
  25. *
  26. *  SYNOPSIS
  27. *    BumpRevMO Version/N/A,File/A,Modula/S
  28. *
  29. *  FUNCTION
  30. *     This tools works like the bumprev tool on the developers disks,
  31. *     but outputs Modula-2 and Oberon source.
  32. *
  33. *     It creates a new module with the tools name concated with
  34. *     "Rev", and (if not already existing) a revision file with the
  35. *     name of this module and extension ".rev".
  36. *
  37. *     If the option Modula is set, then the program will create a
  38. *     proper Modula-2 definition module, else a Oberon module.
  39. *
  40. *     If the txt/ sub-dir exists, the program will cd there and then
  41. *     try to open the needed file. This behavior should become more
  42. *     flexible in future to work like AmigaOberon and perhaps like
  43. *     M2Amiga.
  44. *
  45. *  EXAMPLE
  46. *     shell-prompt> bumprev 17 foobar
  47. *     bumprev: creating new revision file
  48. *     bumprev: bumped foobar to revision 1
  49. *     shell-prompt> bumprev 17 foobar
  50. *     bumprev: bumped foobar to revision 2
  51. *
  52. *     This has created the files foobarRev.mod and foobarRev.rev.
  53. *     foobarRev.mod looks like this:
  54. *     .....8<-------
  55. *     MODULE foobarRev;
  56. *     CONST
  57. *       version  * = 17;
  58. *       revision * = 2;
  59. *       date     * = '9.3.93';
  60. *       vers     * = 'foobar 17.2';
  61. *       vString  * = 'foobar 17.2 (9.3.93)\r\n';
  62. *       versTag  * = '$VER: foobar 17.2 (9.3.93)\r\n';
  63. *
  64. *     END foobarRev.
  65. *     .....8<-------
  66. *
  67. ************)*)
  68.  
  69. IMPORT
  70.   d  := Dos,
  71.   e  := Exec,
  72.   ol := OberonLib,
  73.   Printf,
  74.   Timer,
  75.   u  := Utility,
  76.   y  := SYSTEM;
  77.  
  78. CONST
  79.   need20 = "I need at least AmigaDos 2.0\n";
  80.   version = "$VER: BumpRevMO 1.0 (9.3.93) [hG]";
  81.   template = "Version/N/A,File/A,Modula/S";
  82.   programName = "BumpRevMO";
  83.   newRevision = "%s: creating new revision file\n";
  84.   revisionBumped = "%s: bumped %s to revision %ld\n";
  85.  
  86. TYPE
  87.   argsType = STRUCT
  88.     version: POINTER TO ARRAY 1 OF LONGINT;
  89.     file:    e.STRPTR;
  90.     modula:  LONGINT;
  91.   END;
  92.  
  93. VAR
  94.   arguments: d.RDArgsPtr;
  95.   argv: argsType;
  96.   file: d.FileHandlePtr;
  97.   revision: LONGINT;
  98.   day,month,year: INTEGER;
  99.   thisDir, oldDir: d.FileLockPtr;
  100.   filename: e.STRING;
  101.   prgname: e.STRING;
  102.  
  103. PROCEDURE PrintFault();
  104. BEGIN
  105.   IF d.PrintFault(d.IoErr(),prgname) THEN END;
  106.   HALT(20);
  107. END PrintFault;
  108.  
  109.  
  110. PROCEDURE GetDate;
  111. VAR
  112.   timeReqPtr: Timer.TimeRequestPtr;
  113.   sysTime: Timer.TimeVal;
  114.   success: BOOLEAN;
  115.   clockData: u.ClockData;
  116. BEGIN
  117.   success := FALSE;
  118.   NEW(timeReqPtr);
  119.   IF timeReqPtr # NIL THEN
  120.     IF e.OpenDevice(Timer.timerName,Timer.vBlank,timeReqPtr,LONGSET{}) = 0 THEN
  121.       Timer.base := timeReqPtr.node.device;
  122.       Timer.GetSysTime(sysTime);
  123.       e.CloseDevice(timeReqPtr);
  124.       success := TRUE;
  125.     END;
  126.     (* $IFNOT GarbageCollector *)
  127.     DISPOSE(timeReqPtr);
  128.     (* $END *)
  129.   END;
  130.   IF ~success THEN
  131.     HALT(20);
  132.   END;
  133.   u.Amiga2Date(sysTime.secs,clockData);
  134.   day   := clockData.mday;
  135.   month := clockData.month;
  136.   year  := clockData.year MOD 100; (* only two digits for the year :-( *)
  137. END GetDate;
  138.  
  139.  
  140. PROCEDURE BumpRevMOision(filename: ARRAY OF CHAR); (* $CopyArrays- *)
  141.  
  142.   PROCEDURE Print(contents: ARRAY OF CHAR); (* $CopyArrays- *)
  143.   BEGIN
  144.     IF d.FPrintf(file,contents,
  145.                       argv.file,
  146.                       argv.version[0],
  147.                       revision,
  148.                       day,month,year,
  149.                       argv.file,argv.version[0],revision,
  150.                       argv.file,argv.version[0],revision,day,month,year,
  151.                       argv.file,argv.version[0],revision,day,month,year,
  152.                       argv.file)
  153.       < 0 THEN PrintFault;
  154.     END;
  155.   END Print;
  156.  
  157. CONST
  158.   modHead = "DEFINITION MODULE %sRev;\n"
  159.             "CONST\n"
  160.             "  version  = %ld;\n"
  161.             "  revision = %ld;\n"
  162.             "  date     = '%ld.%ld.%ld';\n"
  163.             "  vers     = '%s %ld.%ld';\n"
  164.             "  vString  = '%s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
  165.             "  versTag  = '$VER: %s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
  166.             "\nEND %sRev.\n";
  167.   oberonHead = "MODULE %sRev;\n(* $Implementation- *)\n"
  168.                "CONST\n"
  169.                "  version  * = %ld;\n"
  170.                "  revision * = %ld;\n"
  171.                "  date     * = '%ld.%ld.%ld';\n"
  172.                "  vers     * = '%s %ld.%ld';\n"
  173.                "  vString  * = '%s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
  174.                "  versTag  * = '$VER: %s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
  175.                "\nEND %sRev.\n";
  176.  
  177. BEGIN
  178.   file := d.Open(filename,d.newFile);
  179.   IF file = NIL THEN PrintFault; END;
  180.   IF argv.modula # d.DOSFALSE THEN
  181.     Print(modHead);
  182.   ELSE
  183.     Print(oberonHead);
  184.   END;
  185.   IF ~ d.Close(file) THEN
  186.     file := NIL;
  187.     PrintFault();
  188.   END;
  189.   file := NIL;
  190. END BumpRevMOision;
  191.  
  192.  
  193. PROCEDURE CheckTxtDir;
  194. BEGIN
  195.   thisDir := d.Lock("txt",d.sharedLock);
  196.   IF thisDir # NIL THEN
  197.     oldDir := d.CurrentDir(thisDir);
  198.   ELSE
  199.     oldDir := NIL;
  200.   END;
  201. END CheckTxtDir;
  202.  
  203.  
  204. PROCEDURE ReadRevision(filename: ARRAY OF CHAR): BOOLEAN;
  205. (* $CopyArrays- *)
  206. VAR
  207.   rev: LONGINT;
  208.   buffer: ARRAY 50 OF CHAR;
  209. BEGIN
  210.   file := d.Open(filename,d.oldFile);
  211.   IF file = NIL THEN
  212.     RETURN FALSE;
  213.   END;
  214.   IF d.FGets(file,buffer,SIZE(buffer)-1) = NIL THEN
  215.     (* IF ioerr = 0 no line read!! *)
  216.     PrintFault;
  217.   END;
  218.   IF d.StrToLong(buffer,rev) < 0 THEN
  219.     PrintFault; END;
  220.   revision := SHORT(rev);
  221.   d.OldClose(file);
  222.   file := NIL;
  223.   RETURN TRUE;
  224. END ReadRevision;
  225.  
  226.  
  227. PROCEDURE WriteRevision(filename: ARRAY OF CHAR); (* $CopyArrays- *)
  228. VAR
  229.   rev: LONGINT;
  230. BEGIN
  231.   file := d.Open(filename,d.newFile);
  232.   IF file = NIL THEN PrintFault; END;
  233.   IF d.FPrintf(file,"%ld",revision) < 0 THEN
  234.     PrintFault; END;
  235.   IF ~ d.Close(file) THEN
  236.     file := NIL;
  237.     PrintFault();
  238.   END;
  239.   file := NIL;
  240. END WriteRevision;
  241.  
  242.  
  243. PROCEDURE MakeFileName(VAR buffer: ARRAY OF CHAR; name, extension: ARRAY OF CHAR);
  244. (* $CopyArrays- *)
  245. BEGIN
  246.   Printf.SPrintf2(buffer,"%s%s",y.ADR(name),y.ADR(extension));
  247. END MakeFileName;
  248.  
  249.  
  250. BEGIN
  251.   IF ol.wbStarted THEN HALT(20); END; (* WB, what's THAT? :-) *)
  252.   IF d.dos.lib.version < 36 THEN
  253.     IF d.Write(d.Output(),need20,SIZE(need20)) = 0 THEN END;
  254.     HALT(20);
  255.   END;
  256.   prgname := version;
  257.   IF ~ d.GetProgramName(prgname,30) THEN prgname := programName END;
  258.  
  259.   arguments := d.ReadArgs(template,argv,NIL);
  260.   IF arguments = NIL THEN
  261.     PrintFault;
  262.   END;
  263.   GetDate;
  264.   CheckTxtDir;
  265.   MakeFileName(filename,argv.file^,"Rev.rev");
  266.   IF ~ReadRevision(filename) THEN
  267.     IF d.FPrintf(d.Output(),newRevision,y.ADR(prgname)) = 0 THEN END;
  268.     revision := 0;
  269.   END;
  270.   INC(revision);
  271.   WriteRevision(filename);
  272.   IF d.FPrintf(d.Output(),revisionBumped,y.ADR(prgname),argv.file,revision) = 0 THEN END;
  273.   MakeFileName(filename,argv.file^,"Rev.mod");
  274.   BumpRevMOision(filename);
  275.  
  276. CLOSE
  277.   IF file # NIL THEN d.OldClose(file); END;
  278.   IF oldDir # NIL THEN
  279.     IF d.CurrentDir(oldDir) = NIL THEN END;
  280.   END;
  281.   IF thisDir # NIL THEN d.UnLock(thisDir); END;
  282. END BumpRevMO.
  283.